package symbols;

import java.util.LinkedList;
import java.util.Vector;

/**
 * Simbolos que compoem a Tabela de Simbolos
 * @param <Matrix>
 */
public class Simbolo {
	public String identificador; // nome do identificador
	public String escopo; // escopo que esta inserido
	public Type tipo; // tipo da variavel
	public boolean isVetor; // se eh vetor
	public Integer tamanhoVetor; // tamanho do vetor
	public Type tipoRetorno; // tipo de retorno para funcoes
	public Vector<Simbolo> listaArgumentos; // lista e argumentos para funcoes
	public String valorAtual; // valor atual da variavel
	
	// variavel
	public Simbolo(String identificador, String escopo, Type tipo, boolean isVetor) {
		super();
		this.identificador = identificador;
		this.escopo = escopo;
		this.tipo = tipo;
		this.isVetor = isVetor;
		this.tamanhoVetor = null;
	}

	// vetor
	public Simbolo(String identificador, String escopo, Type tipo, boolean isVetor, Integer tamanhoVetor) {
		super();
		this.identificador = identificador;
		this.escopo = escopo;
		this.tipo = tipo;
		this.isVetor = isVetor;
		this.tamanhoVetor = tamanhoVetor;
	}
	
	// matriz
//	public  Simbolo(String identificador, String escopo, Type tipo, boolean isVetor, Integer tamanhoVetor) {
//		super();
//		this.identificador = identificador;
//		this.escopo = escopo;
//		this.tipo = tipo;
//		this.isVetor = isVetor;
//		this.tamanhoVetor = tamanhoVetor;
//	}
	
	// funcao com retorno tipado com argumentos
	public Simbolo(String identificador, String escopo, Type tipoRetorno, Vector<Simbolo> listaArgumentos) {
		super();
		this.identificador = identificador;
		this.escopo = escopo;
		this.tipoRetorno = tipoRetorno;
		this.listaArgumentos = listaArgumentos;
	}
	
	// funcao com retorno tipado sem argumentos
	public Simbolo(String identificador, String escopo, Type tipoRetorno) {
		super();
		this.identificador = identificador;
		this.escopo = escopo;
		this.tipoRetorno = tipoRetorno;
	}
	
	// funcao void com argumentos
	public Simbolo(String identificador, String escopo, Vector<Simbolo> listaArgumentos) {
		super();
		this.identificador = identificador;
		this.escopo = escopo;
		this.listaArgumentos = listaArgumentos;
	}
	
	// funcao void sem argumentos
	public Simbolo(String identificador, String escopo) {
		super();
		this.identificador = identificador;
		this.escopo = escopo;
	}
	
	public Simbolo (Integer valor) {
		super();
		this.valorAtual = String.valueOf(valor);
	}

	public String getIdentificador() {
		return identificador;
	}

	public void setIdentificador(String identificador) {
		this.identificador = identificador;
	}

	public String getEscopo() {
		return escopo;
	}

	public void setEscopo(String escopo) {
		this.escopo = escopo;
	}

	public Type getTipo() {
		return tipo;
	}

	public void setTipo(Type tipo) {
		this.tipo = tipo;
	}

	public boolean isVetor() {
		return isVetor;
	}

	public void setVetor(boolean isVetor) {
		this.isVetor = isVetor;
	}

	public Integer getTamanhoVetor() {
		return tamanhoVetor;
	}

	public void setTamanhoVetor(Integer tamanhoVetor) {
		this.tamanhoVetor = tamanhoVetor;
	}

	public Type getTipoRetorno() {
		return tipoRetorno;
	}

	public void setTipoRetorno(Type tipoRetorno) {
		this.tipoRetorno = tipoRetorno;
	}

	public Vector<Simbolo> getListaArgumentos() {
		return listaArgumentos;
	}

	public void setListaArgumentos(Vector<Simbolo> listaArgumentos) {
		this.listaArgumentos = listaArgumentos;
	}

	public String getValorAtual() {
		return valorAtual;
	}

	public void setValorAtual(String valorAtual) {
		this.valorAtual = valorAtual;
	}

	public String getEscopoIdentificador() {
		return this.escopo + "_" + this.identificador;
	}

}
